package com.mydemo.controller;

import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.ai.chat.prompt.SystemPromptTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.util.List;
import java.util.Map;

@RestController
public class PromptTemplateController {

    /**
     * 通过 chatmodel 实现流式响应
     */
    @Resource(name="deepseek")
    private ChatModel deepSeekModel;

    @Resource(name="qwen")
    private ChatModel qwenModel;

    /**
     * 通过 chatclient 实现流式响应
     */
    @Resource(name="deepSeekChatClient")
    private ChatClient deepSeekClient;
    @Resource(name="qwenChatClient")
    private ChatClient qwenClient;


    /**
     * 使用 PromptTemplate 创建 Prompt 对象
     * @param topic
     * @param output_format
     * @param wordCount
     * @return
     */
    @GetMapping("/promptTemplate")
    public Flux<String> templateChat(String topic,String output_format,String wordCount){
        PromptTemplate promptTemplate = new PromptTemplate(
                "讲一个关于{topic}的故事" +
                "并以{output_format}格式输出" +
                "字数在{wordCount}左右");
        Prompt prompt = promptTemplate.create(Map.of(
                "topic", topic,
                "output_format", output_format,
                "wordCount", wordCount
        ));
        return qwenClient.prompt(prompt).stream().content();
    }

    /**
     * 使用 PromptTemplate 模板文件创建 Prompt 对象
     * @param topic
     * @param output_format
     * @param wordCount
     * @return
     */
    @Value("classpath:/prompttemplate/templateconfig.txt")
    private org.springframework.core.io.Resource userTemplate;

    //http://localhost:8006/promptTemplate2?topic=java&output_format=html&wordCount=200
    @GetMapping("/promptTemplate2")
    public Flux<String> templateChat2(String topic,String output_format,String wordCount){
        PromptTemplate promptTemplate = new PromptTemplate(userTemplate);
        Prompt prompt = promptTemplate.create(Map.of(
                "topic", topic,
                "output_format", output_format,
                "wordCount", wordCount
        ));
        return qwenClient.prompt(prompt).stream().content();
    }

    //http://localhost:8006/promptTemplate3?sysTopic=法律助手&userTopic=劳动仲裁
    @GetMapping("/promptTemplate3")
    public String templateChat3(String sysTopic,String userTopic){
        //1. 创建系统提示词模板
        SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(
                "你是一个{sysTopic}助手，回答与{userTopic}相关的问题，其它问题，你只回复，抱歉，我目前还没有掌握这方面的知识");
        Message systemMessage = systemPromptTemplate.createMessage(Map.of(
                "sysTopic", sysTopic,
                "userTopic", userTopic
        ));
        //2. 创建提示词模板
        PromptTemplate promptTemplate = new PromptTemplate("请详细解释{userTopic}");
        Message userMessage = promptTemplate.createMessage(Map.of(
                "userTopic", userTopic
        ));
        Prompt prompt = new Prompt(List.of(systemMessage, userMessage));

        return qwenClient.prompt(prompt).call().content();


    }


    //http://localhost:8006/promptTemplate4?sysTopic=法律助手&userTopic=劳动仲裁
    @GetMapping("/promptTemplate4")
    public String templateChat4(String sysTopic,String userTopic){
        //1. 创建系统提示词模板
        SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(
                "你是一个{sysTopic}助手，回答与{userTopic}相关的问题，其它问题，你只回复，抱歉，我目前还没有掌握这方面的知识");
        Message systemMessage = systemPromptTemplate.createMessage(Map.of(
                "sysTopic", sysTopic,
                "userTopic", userTopic
        ));
        //2. 创建提示词模板
        PromptTemplate promptTemplate = new PromptTemplate("请详细解释{userTopic}");
        Message userMessage = promptTemplate.createMessage(Map.of(
                "userTopic", userTopic
        ));
        Prompt prompt = new Prompt(List.of(systemMessage, userMessage));

        return qwenModel.call(prompt).getResult().getOutput().getText();

    }


}
